iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0

昨天介紹完,簡易的建立自己的 helm chart 後,今年我們要談談,怎麼使用 helm 裡面的 values 的功能,以及它階層的功能。

首先我們先看我我設定了一個情境,那個情境為,我要做一個流量計數器,實作方式,我會透過 golang 寫一個 http server ,透過 http request 進來,會使用 redis 做 incr。 這邊有 code

再來看看我們要怎麼使用 helm 設計這個結構呢? 先看下面的資料夾結構

helm-folder

上面藍色框框的就是我在一個 counter 的 charts 資料夾裡面,又多建立一個 redis charts。 這種做法我把它稱為 sub charts,我把它理解為, counter 需要 depend on redis。

這裡面教大家一個 helm 預先 render 的小訣竅。

$ helm template ./redis
# Source: redis/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  labels:
    helm.sh/chart: redis-0.1.0
    app.kubernetes.io/name: redis
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: redis
      app.kubernetes.io/instance: RELEASE-NAME
  template:
    metadata:
      labels:
        app.kubernetes.io/name: redis
        app.kubernetes.io/instance: RELEASE-NAME
    spec:
      serviceAccountName: redis
      securityContext:
        {}
      containers:
        - name: redis
          securityContext:
            {}
          image: "redis:5.0.5"
          imagePullPolicy: IfNotPresent
          ports:
            - name: redis
              containerPort: 6479
              protocol: TCP
          resources:
            {}
--- 下略...

透過這個方式可以知道你的 yaml 檔有沒有如你預期的樣子。

回到主題,我們看到上面目前 redis image 的版本是用 5.0.5版,因為它預設吃到的是 redis 自己的 value.yaml 也就是如圖示

helm-redis-value

注意它不是吃到下面那個 value.yaml,是藍色框框指到的 value.yaml

這時侯我們來實驗一件事情,我們要怎麼透過父層 value.yaml 來修改子層呢? 我們只要在 counter 的 value.yaml 加入如下

redis:
  image:
    tag: "5.0.4"

這時侯你下

# 注意 這邊是對 counter render 上面是對 redis render
$ helm template ./counter
# Source: counter/charts/redis/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  labels:
    helm.sh/chart: redis-0.1.0
    app.kubernetes.io/name: redis
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: redis
      app.kubernetes.io/instance: RELEASE-NAME
  template:
    metadata:
      labels:
        app.kubernetes.io/name: redis
        app.kubernetes.io/instance: RELEASE-NAME
    spec:
      serviceAccountName: redis
      securityContext:
        {}
      containers:
        - name: redis
          securityContext:
            {}
          image: "redis:5.0.4"
          imagePullPolicy: IfNotPresent
          ports:
            - name: redis
              containerPort: 6479
              protocol: TCP
          resources:
            {}
--- 下略...

有沒有注意到? 我們 redis 的版本被改成 5.0.4 了,由這邊我們知道 value.yaml,會由最父層開始讀取,如果沒有父層,才會取子層。

這邊補充一下,helm value 裡面有提供一個保留字叫做 global ,因為他的階層關係都是用 helm 的 name 去做定義。所以假設今天我有兩個服務都要透過同一個 mysql 服務,我怎麼用同一個 value.yaml 去控制呢?

global:
    mysql:
       address: 127.0.0.1:3306
       password: test1234
       db: default

那在 template上面描寫就可以如下

containers:
      - name: example
        securityContext:
        {}
        image: "example"
        imagePullPolicy: IfNotPresent
        env:
        - mysql_address: {{.Values.global.mysql.address}}
        - mysql_password: {{.Values.global.mysql.password}}
        - mysql_db: {{.Values.global.mysql.db}}
        value: "redis:6379"

上面的 helm chart 這邊有 code 可以參考

明天我會實際分享一下,我們專案的 helm 架構分享。


上一篇
Day14 怎麼撰寫 helm template
下一篇
Day16 我怎麼規劃 helm charts
系列文
k8s 生態鏈 完美組合30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言